package cn.patpang.core.tool;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @Title: ArrayTool.java
 * @Author Patrick Pang
 * @Date 2014-8-28
 * @Description 数组集合工具类
 */
public class ArrayTool {

    /**
     * 是否包含空值
     *
     * @param array
     * @return
     */
    public static boolean hasNull(Object[] array) {
        if (null == array) {
            return true;
        }

        for (Object obj : array) {
            if (null == obj) {
                return true;
            }
        }

        return false;
    }

    /**
     * 是否包含空值
     *
     * @param array
     * @return
     */
    public static boolean hasNullStrings(String... array) {
        if (null == array) {
            return true;
        }

        for (String s : array) {
            if (StringUtils.isBlank(s)) {
                return true;
            }
        }

        return false;
    }

    /**
     * 字符串输出
     *
     * @param array
     * @return String 字符串
     */
    public static String toString(Object[] array) {
        String reStr;

        reStr = "";
        if (null != array && StringUtils.isNotBlank(reStr = Arrays.toString(array))) {
            reStr = reStr.replaceAll(" ", "").substring(1, reStr.length() - 1);
        }

        return reStr;
    }

    /**
     * string 数组转integer数组
     *
     * @param oArr
     * @return
     */
    public static Integer[] s2I(String[] oArr) {
        if (null == oArr || oArr.length == 0)
            return null;

        List<Integer> reIntList = new ArrayList<Integer>();
        for (String oa : oArr) {
            if (StringUtils.isNotBlank(oa) && StringUtils.isNumeric(oa)) {
                reIntList.add(Integer.valueOf(oa.trim()));
            }
        }

        return reIntList.toArray(new Integer[reIntList.size()]);
    }

    /**
     * obj 数组转字符串数组
     *
     * @param oArr
     * @return
     */
    public static String[] o2S(Object[] oArr) {
        if (null == oArr || oArr.length == 0)
            return null;
        return Arrays.asList(oArr).toArray(new String[oArr.length]);
    }

    /**
     * obj 数组转integer数组
     *
     * @param oArr
     * @return
     */
    public static Integer[] o2I(Object[] oArr) {
        if (null == oArr || oArr.length == 0)
            return null;
        return Arrays.asList(oArr).toArray(new Integer[oArr.length]);
    }

    /**
     * obj 数组转Long数组
     *
     * @param oArr
     * @return
     */
    public static Long[] o2L(Object[] oArr) {
        if (null == oArr || oArr.length == 0)
            return null;
        return Arrays.asList(oArr).toArray(new Long[oArr.length]);
    }

    /***************************************************************************************************************
     * 其他拓展方法请使用 org.apache.commons.lang3.ArrayUtils.ArrayUtils 方法介绍
     */
    public void otherTool() {
        String strs[] = {"str1", "str2", "str3", null};
        p("向数组中首位添加元素", ArrayUtils.add(strs, 0, "首位"));
        p("向数组中末尾添加元素", ArrayUtils.add(strs, "末尾"));
        p("向数组指定位置添加元素", ArrayUtils.add(strs, 1, "指定index"));
        p("向数组添加多个元素", ArrayUtils.addAll(strs, "add1", "add2"));
        p("复制数组", ArrayUtils.clone(strs));
        p("是否包含指定元素", ArrayUtils.contains(strs, "str2"));
        p("获取数组的长度", ArrayUtils.getLength(null));
        p("查找第一次出现的位置", ArrayUtils.indexOf(strs, "str2"));
        p("查找最后一次出现的位置", ArrayUtils.lastIndexOf(strs, "str2"));
        p("判断数组是否非空", ArrayUtils.isNotEmpty(strs));
        p("从数组中移除指定索引的元素", ArrayUtils.remove(strs, 1));

        ArrayUtils.reverse(strs);
        p("颠倒数组", strs);

        String mapStr[][] = {{"key1", "value1"}, {"key2", "value2"}};
        p("将二维数组转换成Map", ArrayUtils.toMap(mapStr));

        p("将数组用字符串的形式输出", ArrayUtils.toString(strs));
    }

    /**
     * @param title
     * @param obj
     * @param <T>
     */
    private <T> void p(String title, T... obj) {
        System.out.println("\n----------" + title + "----------");
        System.out.print("输出结果 [");
        if (obj == null)
            return;
        for (T t : obj) {
            System.out.print(t + "\t");
        }
        System.out.println("]");
    }
}
